﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Runtime.InteropServices;

namespace Lcsoft.Data.RDBMS.Results
{
	/// <summary>
	/// 表示查询结果中的输出参数。
	/// </summary>
	[ComVisible(true)]
	public sealed class OutputParameter
	{
		/// <summary>
		/// 初始化 <see cref="OutputParameter"/> 的新实例。
		/// </summary>
		/// <param name="parameterName">指定参数名称。</param>
		/// <param name="parameterValue">指定参数的值。</param>
		public OutputParameter(string parameterName, object parameterValue)
		{
			this.Name = parameterName;
			this.Value = parameterValue;
		}

		/// <summary>
		/// 设置或获取输出参数的值。
		/// </summary>
		public object Value { get; set; }

		/// <summary>
		/// 获取输出参数名称。
		/// </summary>
		public string Name { get; private set; }

		/// <summary>
		/// 提取指定类型的对象。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <returns>返回指定类型的对象的实例。</returns>
		public T Fetch<T>()
		{
			try
			{
				return (T)Convert.ChangeType(this.Value, typeof(T));
			}
			catch (InvalidCastException e)
			{
				throw new SimpleSqlException("提取 OutputParameter 的值的时遇到无效的类型转换：", e);
			}
			catch (Exception ex)
			{
				throw new SimpleSqlException("提取 OutputParameter 的值的时发生异常：", ex);
			}
		}
	}
}
